package com.leenmvc.core.enums;

import com.leenmvc.core.cache.CacheFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 缓存类型
 */
public enum CacheType {

    STATUS("系统状态变量", CacheMethod.SYSTEM, null),

    GLOBAL_VARIABLE("系统全局变量", CacheMethod.SYSTEM,null),

    URL_INFO("URL关联的数据缓存", CacheMethod.SYSTEM,null),

    SINGLE_FIELD("dao方法根据主键ID获取其他表单字段值", CacheMethod.REDIS, RedisDataType.MAP, "redisOrderTemplate"),

    /***
     * key值为token, 值为当前token对应的用户的所有信息包括 权限等
     */
    USER_INFO("用户信息缓存到Redis", CacheMethod.BOTH, RedisDataType.OBJECT, "redisOrderTemplate");

    /**
     * 说明
     */
    public String note;

    /**
     * 在哪里缓存
     */
    public CacheMethod whereCache;

    /**
     * 在redis中以什么结构保存
     */
    public RedisDataType redisDataType;

    /**
     * redis配置的RedisTemplate, 有这个配置可以配置多个redis数据源
     * Memacache 配置的
     */
    public String templateName;

    /**
     *
     */
    private String host;

    /**
     *
     */
    private int port;

    /**
     * @param note          说明文字
     * @param whereCache    在哪里缓存
     * @param redisDataType redis的数据类型
     */
    CacheType(String note, CacheMethod whereCache, RedisDataType redisDataType) {
        this.note = note;
        this.whereCache = whereCache;
        this.redisDataType = redisDataType;
    }

    /**
     * @param note          说明文字
     * @param whereCache    在哪里缓存
     * @param redisDataType redis的数据类型
     * @param templateName  使用哪个template
     */
    CacheType(String note, CacheMethod whereCache, RedisDataType redisDataType, String templateName) {
        this.note = note;
        this.whereCache = whereCache;
        this.redisDataType = redisDataType;
        this.templateName = templateName;
    }

    /**
     * @param note
     * @param whereCache
     * @param redisDataType
     * @param templateName
     * @param host
     * @param port
     */
    CacheType(String note, CacheMethod whereCache, RedisDataType redisDataType, String templateName, String host, int port) {
        this.note = note;
        this.whereCache = whereCache;
        this.redisDataType = redisDataType;
        this.templateName = templateName;
        this.host = host;
        this.port = port;
    }

    /**
     * 获取类型是redis的枚举列表
     *
     * @return
     */
    public static List<CacheType> getRedisItem() {
        List<CacheType> result = new ArrayList<>();
        for (CacheType type : CacheType.values()) {
            if (CacheMethod.REDIS.equals(type.whereCache) || CacheMethod.BOTH.equals(type.whereCache)) {
                result.add(type);
            }
        }
        return result;
    }

    public String getHost() {
        Map<String, Object> map = CacheFactory.get(CacheType.GLOBAL_VARIABLE, templateName);
        if(map == null) return null;
        return map.get("host").toString();
    }

    public int getPort() {
        Map<String, Object> map = CacheFactory.get(CacheType.GLOBAL_VARIABLE, templateName);
        if(map == null) return 0;
        return (int)map.get("port");
    }

}
